#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <unistd.h>
#include <string.h>
#include <assert.h>

#include <fcntl.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <dirent.h>

#include "get_index.h"
#include "config/config.h"

bool 
est_dossier(char *nom_fichier)
{
  struct stat sts;
  stat(nom_fichier,&sts);
  bool isdir = S_ISDIR(sts.st_mode);

  return isdir;
}

char*
generer_index(char *nom_dossier, char *titre)
{
  
  

  char *head_1="<html> <head> <title>";
  char *head_2=" </title> </head><body>\n<H2>Index :</H2>\n<UL>";

  char *aref_1="<LI><a href=\"";
  char *aref_2="\">";
  char *aref_3="</a>\n";

  char *foot="</UL><body></html>";

  int taille_index = strlen(head_1)+strlen(head_2)+strlen(titre)+1;
  char *index = malloc(sizeof(char) * taille_index);
  
  sprintf(index,"%s%s%s",head_1,titre,head_2);
  
  
  char *dossier = malloc(sizeof(char)*(strlen(ROOT)+strlen(nom_dossier)+1));
  strcpy(dossier,ROOT);
  strcat(dossier,nom_dossier);  

  char *ls = liste_fichier(dossier," ");
  char *ls_cpy = ls;

  printf("ls = %s\n",ls);

  while (ls != NULL)
    {

      int i = 0;
      for (; ls[i] != '\0' && ls[i] != ' ';i++)
	;
      
      if (i == 0)
	{
	  //pas cense venir ici
	  break;
	}

      char *nom_fichier = malloc(sizeof(char)*(i+1));

      strncpy(nom_fichier, ls, i);
      nom_fichier[i] = '\0';

      int taille_ligne = strlen(aref_1)+strlen(aref_2)+strlen(nom_dossier)+i*2+strlen(aref_3)+2;
      char *ligne = malloc(sizeof(char)*taille_ligne);
      
      sprintf(ligne,"%s%s/%s%s%s%s",aref_1,nom_dossier,nom_fichier,aref_2,nom_fichier,aref_3);

      if (taille_index < strlen(index) + taille_ligne)
	{
	  taille_index <<=1;

	  if (taille_index < strlen(index) + taille_ligne)
	    taille_index = strlen(index) + taille_ligne;

	  index = realloc(index, taille_index);
	}

      strcat(index, ligne);

      free(nom_fichier);
      free(ligne);
      nom_fichier = NULL;
      ligne = NULL;

      ls = strchr(ls,' ');
      if (ls == NULL)
	break;
      ls +=1;
    }
  
  free(ls_cpy);
  ls_cpy = NULL;

  taille_index = strlen(index) + strlen(foot)+1;
  index = realloc(index, taille_index);
  strcat(index, foot);

  return index;
}


char*
liste_fichier(char *nom_dossier, char *separateur)
{
  struct dirent *lecture;
  DIR *repertoire= opendir(nom_dossier);
     
  char*s;
  int size;

  if ((lecture = readdir (repertoire)))
    {
      printf("lecture name = %s\n",lecture->d_name);
      size = sizeof(char) * (strlen(lecture->d_name)+ 1);
      s = malloc (size);
      strcpy(s,lecture->d_name);
      
    }
  
 
  while ((lecture = readdir(repertoire)))
    { 
      printf("lecture name = %s\n",lecture->d_name);
      int taille =  strlen(s) + strlen(lecture->d_name) + strlen(separateur) + 1;

      if (size < taille)
	{
	  size <<= 1;

	  if (size < taille)
	    size = taille;

	  s = realloc (s, size);
	}
      strcat(s, separateur);
      strcat(s, lecture->d_name);
      
    }
  
  s = realloc(s, sizeof(char)*(strlen(s)+1));//peut poser probleme ?
  
  closedir(repertoire);
  return s;
}

bool
index_existe(char *nom_dossier)
{
  
  char *s=liste_fichier(nom_dossier," ");
  bool b = 0;

  if (s)
    {
      b = (strstr(s, "index.html ")!=NULL) || (strstr(s, "index.htm ")!=NULL);
      
      free(s);
      s = NULL;
    }
  return b;
}


/*
char*
liste_fichier(char *nom_dossier, char *separateur)
{
  int nb_lu=0;
  int nb_fichiers=0;

  struct dirent *lecture;
  printf("liste 1\n");
  DIR *repertoire= opendir(nom_dossier);
  printf("liste 2\n");
  while ((lecture = readdir(repertoire))) 
    {
      nb_lu+= strlen( lecture->d_name);
      nb_fichiers++;
    }
  nb_lu++;
  
  char*s=malloc(nb_lu*sizeof(char)+(nb_fichiers-1)*sizeof(separateur));
  
  printf("liste 3\n");
  rewinddir(repertoire);
  printf("liste 4\n");
  while ((lecture = readdir(repertoire)))
    { 
      printf("lecture name = %s\n",lecture->d_name);
      strcat(s, lecture->d_name);
      strcat(s, separateur);
    }
  strcat(s,"\0");
  
  printf("liste 5\n");
  closedir(repertoire);
  printf("liste 6\n");
  return s;
  }*/


/*
int
main(int argc,char* argv[])
{

  //Décommenter une de des fonctions pour en voir l'usage.
  //printf("%s\n",index_existe(argv[1])?"l'index existe":"l'index n'existe pas");
  //printf("%s\n",liste_fichier(argv[1], " "));
  printf("%s\n",generer_index(argv[1], argv[1]));

  return EXIT_SUCCESS;
}
*/
